package com.sunrise.configuracoes.servico;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import lombok.Getter;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.sunrise.configuracoes.repositorio.iface.FilialDao;
import com.sunrise.configuracoes.repositorio.iface.MetaDao;
import com.sunrise.configuracoes.repositorio.iface.PerfilDao;
import com.sunrise.configuracoes.repositorio.iface.RegraMetaDao;
import com.sunrise.crm.repositorio.iface.UsuarioDao;
import com.sunrise.estoque.repositorio.iface.CategoriaDao;
import com.sunrise.estoque.repositorio.iface.MarcaDao;
import com.sunrise.estoque.repositorio.iface.ProdutoDao;
import com.sunrise.generico.entidade.Categoria;
import com.sunrise.generico.entidade.Filial;
import com.sunrise.generico.entidade.Marca;
import com.sunrise.generico.entidade.Meta;
import com.sunrise.generico.entidade.Perfil;
import com.sunrise.generico.entidade.Produto;
import com.sunrise.generico.entidade.RegraMeta;
import com.sunrise.generico.entidade.Usuario;
import com.sunrise.generico.entidade.iface.EntidadeManter;
import com.sunrise.generico.visao.Filtro;

@Service
@Transactional(readOnly = true)
public class ManterMetaService {

	@Resource(name = "filialDaoImpl")
	@Getter
	private FilialDao filialDAO;

	@Resource(name = "produtoDaoImpl")
	@Getter
	private ProdutoDao produtoDAO;

	@Resource(name = "usuarioDaoImpl")
	@Getter
	private UsuarioDao usuarioDAO;

	@Resource(name = "marcaDaoImpl")
	@Getter
	private MarcaDao marcaDAO;

	@Resource(name = "perfilDaoImpl")
	@Getter
	private PerfilDao perfilDAO;

	@Resource(name = "metaDaoImpl")
	@Getter
	private MetaDao metaDAO;
	
	@Resource(name = "categoriaDaoImpl")
	@Getter
	private CategoriaDao categoriaDAO;

	@Resource(name = "regraMetaDaoImpl")
	@Getter
	private RegraMetaDao regraMetaDAO;

	@Transactional(readOnly = false)
	public void inserir(Meta entidade) {
		for (RegraMeta regra : entidade.getRegras()) {
			regra.setMeta(entidade);
			getRegraMetaDAO().inserir(regra);
		}
		getMetaDAO().inserir(entidade);
	}

	public List<String> listarClasses(String nome, Usuario usuario, Filial filial) {
		List<String> listaEntidades = new ArrayList<String>();
		for (EntidadeManter e : getUsuarioDAO().listarPorNomeFilial(nome, filial)) {
			listaEntidades.add("Vendedor | " + e.getNome());
		}

		for (EntidadeManter e : getMarcaDAO().listarPorNome(nome)) {
			listaEntidades.add("Marca | " + e.getNome());
		}

		for (EntidadeManter e : getPerfilDAO().listarPorNome(nome)) {
			listaEntidades.add("Perfil | " + e.getNome());
		}

		for (EntidadeManter e : getProdutoDAO().listarPorNome(nome)) {
			listaEntidades.add("Produto | " + e.getNome());
		}
		
		for (EntidadeManter e : getCategoriaDAO().listarPorNome(nome)) {
			listaEntidades.add("Categoria | " + e.getNome());
		}
		
		for (EntidadeManter e : getFilialDAO().listarPorNomeUsuario(nome, usuario)) {
			listaEntidades.add("Filial | " + e.getNome());
		}

		return listaEntidades;
	}

	public Marca buscarMarcaPorNome(String nome) {
		return getMarcaDAO().buscarPorNome(nome);
	}

	public Produto buscarProdutoPorNome(String nome) {
		return getProdutoDAO().buscarPorNome(nome);
	}

	public Usuario buscarVendedorPorNome(String nome) {
		return getUsuarioDAO().buscarPorNome(nome);
	}

	public Perfil buscarPerfilPorNome(String nome) {
		return getPerfilDAO().buscarPorNome(nome);
	}

	public Collection<Filial> listarFiliaisPorUsuario(Usuario usuario) {
		return getFilialDAO().listarPorUsuario(usuario);
	}

	public Collection<Meta> listarMetaPorFiltro(Filtro filtro) {
		Collection<Meta> comissoes = getMetaDAO().listarPorFiltro(filtro);
		for (Meta com : comissoes) {
			com.getRegras().size();
		}
		return comissoes;
	}

	public Categoria buscarCategoriaPorNome(String nome) {
		return getCategoriaDAO().buscarPorNome(nome);
	}

	public Filial buscarFilialPorNome(String nome) {
		return getFilialDAO().buscarPorNome(nome);
	}

}